package com.example.thread;

//把上面的这个例子，改成是方法递归调用的写法
// 这个，是用递归的方式写的。写递归的话，要注意写结束递归的条件，不然会无限递归下去，导致内存溢出的。
// 实际试验的话，发觉，这个其实也不会形成死锁，程序能够正常的打印了10次之后，就结束。
// 为什么呢？其实还是因为，synchronized (lock)这种方式用的锁是属于可重入锁哦。
public class DeadlockExample03 {
    // 定义一个互斥的资源
    private static final Object lock = new Object();
    private static int i = 1;

    public static void main(String[] args) {
        // 启动一个线程
        new Thread(() -> {
            recursiveMethod();
        }).start();
    }

    // 递归方法
    private static void recursiveMethod() {
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName() + "获取了锁");

            while(DeadlockExample03.i < 10){
                DeadlockExample03.i++;
                // 递归调用自身
                recursiveMethod();
            }
        }
    }
}
